#!/usr/bin/python
# -*- coding: utf-8 -*-
# @version        : 1.0
# @Creaet Time    : 2021/10/18 22:19 
# @File           : schemas.py
# @IDE            : PyCharm
# @desc           : pydantic 模型，用于数据库序列化操作
from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel


class ItemBase(BaseModel):
    """创建一个 ItemBase 和 UserBase Pydantic 模型以在创建或读取数据时具有共同的属性。"""
    title: str
    description: Optional[str] = None


class ItemCreate(ItemBase):
    """并创建一个从它们继承的 ItemCreate 和 UserCreate（这样它们将具有相同的属性）以及创建所需的任何其他数据（属性）。"""
    pass


class Item(ItemBase):
    """创建用于读取/返回的Pydantic 模型"""
    id: int
    owner_id: int
    create_time: datetime
    update_time: datetime

    class Config:
        """
        Config 类用于为 Pydantic 提供配置。
        Pydantic 的 orm_mode 会告诉 Pydantic 模型读取数据时，它不仅仅会是 dict 类型数据，可能还会是 ORM 模型（或任何其他具有属性的任意对象）。
        这样，它不是仅尝试从 dict 中获取 id 值：id = data["id"]
        它还将尝试从属性获取它，如：id = data.id
        有了这个，Pydantic 模型就可以与 ORM 兼容，您可以在路径操作中的 response_model 参数中声明它。
        您将能够返回数据库模型，并且它将从中读取数据。
        """
        orm_mode = True


class UserBase(BaseModel):
    email: str
    username: str
    nickname: str
    is_active: bool


class UserCreate(UserBase):
    """创建用户模型"""
    password: str


class User(UserBase):
    """获取用户模型"""
    id: int
    items: List[Item] = []
    create_time: datetime
    update_time: datetime

    class Config:
        orm_mode = True